﻿// Inner Fire 游戏引擎库
// 渲染项目类-基础渲染管理器
//
// Copyright (c) 2024 by 尔西大帝. All rights reserved.
//
// 用于UI中的基础渲染管理器。Image和Text渲染管理器都继承此类
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2024-12-24

#pragma once

#include <dx/core/upload_buffer.h>
#include <dx/mesh/dx_mesh.h>
#include <dx/ui/dx_image.h>
#include <dx/ui/dx_text.h>
#include <sprite_pack.h>
#include <ui/text/bmfont.h>

using namespace ikit;

namespace ifire::dx {

// 所有的UI项目需要的通用设置
struct UIMeshDesc {
  XMFLOAT2 ClientSize;
  size_t Capacity;
  ID3D12Device* pDevice;
  ID3D12GraphicsCommandList* pCmdList;
};

/// <summary>
/// 用于文字的类
/// </summary>
class UIMesh {
public:
  UIMesh(const UIMeshDesc& desc);
  UIMesh(const UIMesh& rhs) = delete;
  UIMesh& operator=(const UIMesh& rhs) = delete;
  ~UIMesh() = default;

  inline size_t capacity() const { return capacity_; }
  inline size_t size() const { return size_; }
  inline DxMesh* Mesh() const { return mesh_.get(); }

  // 绘制当前的项目
  void Draw(
      UploadBuffer<UIInstancedData>* uploader, ID3D12GraphicsCommandList* cmd);
  
  // 从当前的池中分配一定数量的顶点资源，返回值是顶点资源的起始位置
  size_t AllocVertex(size_t count);


protected:
  // 客户端的宽高（因为都是与浮点数运算，这里就直接使用了）
  XMFLOAT2 client_size_;
  // 客户端一半的宽高（用于节约一些计算)
  XMFLOAT2 half_size_;
  // 此项目能够容纳的总数量
  size_t capacity_;
  // 此项目当前已经使用的数量
  size_t size_;
  // 当前项目的Mesh
  std::unique_ptr<DxMesh> mesh_;
};


} // namespace ifire